#include <iostream>
#include <cstring>
#include <xercesc/util/PlatformUtils.hpp>
#include "db/SqliteDataSource.h"
#include "db/DataSourceManager.h"
#include "conf.h"
#include <QApplication>
#include <QTextCodec>

#include "ui/MainWindow.h"

#ifdef __DEBUG__
#include "test/AllTests.h"
#include "common/Throwable.h"
#endif /* __DEBUG__ */

XERCES_CPP_NAMESPACE_USE

/*
1. Контейнер полиморфного типа. Построен на основе контейнеров STL. Внешний итератор. Алгоритмы
2. Иерархия классов исключений. Стратегия аномального поведения программы
3. Сериализация. Свой манипулятор
4. Проверка инвариантов, предусловий, постусловий
5. Аллокатор
6. Контроль рефакторингов. Фиксация в отчёте
7. Использование шаблонов проектирования
8. Пространство имён
9. C++ STL
10. Полный набор диаграмм UML
*/

int main(int argc, char** argv) {

    XMLPlatformUtils::Initialize();
    int ret = EXIT_SUCCESS;

    etu::db::DataSource* dataSource = new etu::db::SqliteDataSource(DB_URL);
    etu::db::DataSourceManager::setDataSource(dataSource);

#ifdef __DEBUG__
    if(argc > 1 && (strcmp(argv[1], "--test") == 0)) {

        try {
            ret = etu::AllTests::run();
        } catch(const etu::common::Throwable &t) {
            std::cout << std::endl << t.what();
            std::cout.flush();
        }


    } else {
#endif /* __DEBUG__ */
        std::cout << "Genealogy Tree ver. 0.1" << std::endl;
    	QTextCodec *pCodec = QTextCodec::codecForName("UTF-8");
    	QTextCodec::setCodecForTr(pCodec);
        QApplication app(argc, argv);
        etu::ui::CMainWindow view;
        view.show();
        ret = app.exec();
#ifdef __DEBUG__
    }
#endif /* __DEBUG__ */

  //  delete dataSource;
    XMLPlatformUtils::Terminate();

    return ret;
}
